home *** CD-ROM | disk | FTP | other *** search
/ PC World 2007 June / PCWorld_2007-06_cd.bin / v cisle / tclock / tclocklight-040702-3.exe / source / common / soundselect.c < prev    next >
C/C++ Source or Header  |  2004-04-24  |  7KB  |  259 lines

  1. /*-------------------------------------------------------------
  2.   soundselect.c : select a sound file with "Open" dialog
  3.   (C) 1997-2003 Kazuto Sato
  4.   Please read readme.txt about the license.
  5.   
  6.   Written by Kazubon, Nanashi-san
  7. ---------------------------------------------------------------*/
  8.  
  9. #include "common.h"
  10.  
  11. /* Globals */
  12.  
  13. BOOL BrowseSoundFile(HINSTANCE hInst, HWND hDlg,
  14.     const char *deffile, char *fname);
  15.  
  16. /* Statics */
  17.  
  18. #define IDC_LABTESTSOUND                1
  19. #define IDC_TESTSOUND                   2
  20.  
  21. static BOOL CALLBACK HookProcSound(HWND hDlg, UINT message,
  22.     WPARAM wParam, LPARAM lParam);
  23. static void OnInitDialog(HWND hDlg);
  24. static void OnFileNameChanged(HWND hDlg);
  25. static void OnTestSound(HWND hDlg);
  26. static BOOL bPlaying = FALSE;
  27.  
  28. // OPENFILENAME struct for Win Me/2000
  29. typedef struct _tagOFNA {
  30.    DWORD        lStructSize;
  31.    HWND         hwndOwner;
  32.    HINSTANCE    hInstance;
  33.    LPCSTR       lpstrFilter;
  34.    LPSTR        lpstrCustomFilter;
  35.    DWORD        nMaxCustFilter;
  36.    DWORD        nFilterIndex;
  37.    LPSTR        lpstrFile;
  38.    DWORD        nMaxFile;
  39.    LPSTR        lpstrFileTitle;
  40.    DWORD        nMaxFileTitle;
  41.    LPCSTR       lpstrInitialDir;
  42.    LPCSTR       lpstrTitle;
  43.    DWORD        Flags;
  44.    WORD         nFileOffset;
  45.    WORD         nFileExtension;
  46.    LPCSTR       lpstrDefExt;
  47.    LPARAM       lCustData;
  48.    LPOFNHOOKPROC lpfnHook;
  49.    LPCSTR       lpTemplateName;
  50.    void *       pvReserved;
  51.    DWORD        dwReserved;
  52.    DWORD        FlagsEx;
  53. } _OPENFILENAMEA, *_LPOPENFILENAMEA;
  54.  
  55. /* Externs */
  56.  
  57. extern HICON g_hIconPlay, g_hIconStop;
  58. extern HFONT g_hfontDialog;
  59.  
  60. /*------------------------------------------------
  61.    open dialog to browse sound files
  62. --------------------------------------------------*/
  63. BOOL BrowseSoundFile(HINSTANCE hInst, HWND hDlg,
  64.     const char *deffile, char *fname)
  65. {
  66.     _OPENFILENAMEA ofn;
  67.     char filter[160], mmfileexts[80];
  68.     char ftitle[MAX_PATH], initdir[MAX_PATH];
  69.     int winver;
  70.     
  71.     memset(&ofn, '\0', sizeof(_OPENFILENAMEA));
  72.     
  73.     filter[0] = filter[1] = 0;
  74.     str0cat(filter, "Sound (*.wav,*.mid, ...)");
  75.     GetSoundFileExts(mmfileexts);
  76.     str0cat(filter, mmfileexts);
  77.     str0cat(filter, "All (*.*)");
  78.     str0cat(filter, "*.*");
  79.     
  80.     if(deffile[0] == 0 || IsSoundFile(deffile))
  81.         ofn.nFilterIndex = 1;
  82.     else ofn.nFilterIndex = 2;
  83.     
  84.     initdir[0] = 0;
  85.     
  86.     if(deffile[0])
  87.     {
  88.         WIN32_FIND_DATA fd;
  89.         HANDLE hfind;
  90.         hfind = FindFirstFile(deffile, &fd);
  91.         if(hfind != INVALID_HANDLE_VALUE)
  92.         {
  93.             FindClose(hfind);
  94.             strcpy(initdir, deffile);
  95.             del_title(initdir);
  96.         }
  97.     }
  98.     
  99.     fname[0] = 0;
  100.     
  101.     winver = CheckWinVersion();
  102.     if((winver&WINME) || (winver&WIN2000))
  103.         ofn.lStructSize = sizeof(_OPENFILENAMEA);
  104.     else ofn.lStructSize = sizeof(OPENFILENAME);
  105.     
  106.     ofn.hwndOwner = hDlg;
  107.     ofn.hInstance = hInst;
  108.     ofn.lpstrFilter = filter;
  109.     ofn.lpstrFile= fname;
  110.     ofn.nMaxFile = MAX_PATH;
  111.     ofn.lpstrFileTitle = ftitle;
  112.     ofn.nMaxFileTitle = MAX_PATH;
  113.     ofn.lpstrInitialDir = initdir;
  114.     ofn.lpfnHook = (LPOFNHOOKPROC)HookProcSound;
  115.     ofn.lpTemplateName = "testsoundlg";
  116.     ofn.Flags = OFN_HIDEREADONLY|OFN_EXPLORER|OFN_FILEMUSTEXIST|
  117.         OFN_ENABLEHOOK| OFN_ENABLETEMPLATE;
  118.     
  119.     return GetOpenFileName((LPOPENFILENAME)&ofn);
  120. }
  121.  
  122. /*------------------------------------------------
  123.   hook procedure of common dialog
  124. --------------------------------------------------*/
  125. BOOL CALLBACK HookProcSound(HWND hDlg, UINT message,
  126.     WPARAM wParam, LPARAM lParam)
  127. {
  128.     switch(message)
  129.     {
  130.         case WM_INITDIALOG:
  131.             OnInitDialog(hDlg);
  132.             break;
  133.         case WM_DESTROY:
  134.             if(bPlaying) StopFile(); bPlaying = FALSE;
  135.             break;
  136.         case WM_NOTIFY:
  137.             switch(((LPOFNOTIFY)lParam)->hdr.code)
  138.             {
  139.                 case CDN_SELCHANGE:
  140.                 case CDN_FOLDERCHANGE:
  141.                     OnFileNameChanged(hDlg);
  142.                 break;
  143.             }
  144.             return FALSE;
  145.         case WM_COMMAND:
  146.             if(LOWORD(wParam) == IDC_TESTSOUND)
  147.                 OnTestSound(hDlg);
  148.             return FALSE;
  149.         case MM_MCINOTIFY:
  150.         case MM_WOM_DONE:
  151.             if(message == MM_MCINOTIFY)
  152.                 OnMCINotify(hDlg, wParam, (LONG)lParam);
  153.             else
  154.                 StopFile();
  155.             bPlaying = FALSE;
  156.             SendDlgItemMessage(hDlg, IDC_TESTSOUND, BM_SETIMAGE, IMAGE_ICON,
  157.                 (LPARAM)g_hIconPlay);
  158.             InvalidateRect(GetDlgItem(hDlg, IDC_TESTSOUND), NULL, FALSE);
  159.             return FALSE;
  160.         default:
  161.             return FALSE;
  162.     }
  163.     return TRUE;
  164. }
  165.  
  166. /*------------------------------------------------
  167.   initialize hooked dialog
  168. --------------------------------------------------*/
  169. void OnInitDialog(HWND hDlg)
  170. {
  171.     HWND hwndStatic;
  172.     RECT rc1, rc2;
  173.     POINT pt;
  174.     int dx;
  175.     
  176.     // common/tclang.c
  177.     SetDialogLanguage(hDlg, "TestSound", g_hfontDialog);
  178.     
  179.     // common/dialog.c
  180.     SetMyDialgPos(GetParent(hDlg), 64, 64);
  181.     
  182.     SendDlgItemMessage(hDlg, IDC_TESTSOUND, BM_SETIMAGE, IMAGE_ICON,
  183.         (LPARAM)g_hIconPlay);
  184.     EnableDlgItem(hDlg, IDC_TESTSOUND, FALSE);
  185.     
  186.     bPlaying = FALSE;
  187.     
  188.     // find "File Name:" Label
  189.     hwndStatic = GetDlgItem(GetParent(hDlg), 0x442);
  190.     if(hwndStatic == NULL) return;
  191.     GetWindowRect(hwndStatic, &rc1);
  192.     // move "Test:" Label
  193.     GetWindowRect(GetDlgItem(hDlg, IDC_LABTESTSOUND), &rc2);
  194.     dx = rc1.left - rc2.left;
  195.     pt.x = rc2.left + dx; pt.y = rc2.top;
  196.     ScreenToClient(hDlg, &pt);
  197.     SetWindowPos(GetDlgItem(hDlg, IDC_LABTESTSOUND), NULL, pt.x, pt.y, 0, 0,
  198.         SWP_NOSIZE|SWP_NOZORDER|SWP_NOACTIVATE);
  199.     // move play button
  200.     GetWindowRect(GetDlgItem(hDlg, IDC_TESTSOUND), &rc2);
  201.     pt.x = rc2.left + dx; pt.y = rc2.top;
  202.     ScreenToClient(hDlg, &pt);
  203.     SetWindowPos(GetDlgItem(hDlg, IDC_TESTSOUND), NULL, pt.x, pt.y, 0, 0,
  204.         SWP_NOSIZE|SWP_NOZORDER|SWP_NOACTIVATE);
  205. }
  206.  
  207. /*------------------------------------------------
  208.   when the file name is changed in hooked dialog
  209. --------------------------------------------------*/
  210. void OnFileNameChanged(HWND hDlg)
  211. {
  212.     char fname[MAX_PATH];
  213.     WIN32_FIND_DATA fd;
  214.     HANDLE hfind;
  215.     BOOL b = FALSE;
  216.     
  217.     if (CommDlg_OpenSave_GetFilePath(GetParent(hDlg),
  218.         fname, sizeof(fname)) <= sizeof(fname))
  219.     {
  220.         hfind = FindFirstFile(fname, &fd);
  221.         if(hfind != INVALID_HANDLE_VALUE)
  222.         {
  223.             if(!(fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY))
  224.                 b = TRUE;
  225.             FindClose(hfind);
  226.         }
  227.     }
  228.     EnableDlgItem(hDlg, IDC_TESTSOUND, b);
  229. }
  230.  
  231. /*------------------------------------------------
  232.   "Test" button
  233. --------------------------------------------------*/
  234. void OnTestSound(HWND hDlg)
  235. {
  236.     char fname[MAX_PATH];
  237.     
  238.     if(CommDlg_OpenSave_GetFilePath(GetParent(hDlg),
  239.             fname, sizeof(fname)) <= sizeof(fname))
  240.     {
  241.         if((HICON)SendDlgItemMessage(hDlg, IDC_TESTSOUND,
  242.             BM_GETIMAGE, IMAGE_ICON, 0) == g_hIconPlay)
  243.         {
  244.             if(PlayFile(hDlg, fname, 0))
  245.             {
  246.                 SendDlgItemMessage(hDlg, IDC_TESTSOUND,
  247.                     BM_SETIMAGE, IMAGE_ICON, (LPARAM)g_hIconStop);
  248.                 InvalidateRect(GetDlgItem(hDlg, IDC_TESTSOUND), NULL, FALSE);
  249.                 bPlaying = TRUE;
  250.             }
  251.         }
  252.         else
  253.         {
  254.             StopFile(); bPlaying = FALSE;
  255.         }
  256.     }
  257. }
  258.  
  259.